#ifndef ATTENDANCE_H        // 如果没有定义 ATTENDANCE_H，则执行下面的代码。防止头文件被重复包含。
#define ATTENDANCE_H        // 定义宏 ATTENDANCE_H，用于标记该头文件已经被包含过。

// ==================== 学生信息结构体 ====================
// 这个结构体用于保存学生的基本信息：学号、姓名、班级。
// 同时使用指针形成“单向链表”，可以存储多个学生。
typedef struct Student {
    char id[20];             // 学号（字符串类型，长度不超过19个字符）
    char name[20];           // 姓名
    char className[20];      // 班级名称，例如“计科1班”
    struct Student *next;    // 指向下一个学生节点的指针，用于形成链表
} Student;

// ==================== 考勤记录结构体 ====================
// 这个结构体用于保存每节课每个学生的考勤状态。
// 它也是一个链表节点，记录学生学号和出勤状态。
typedef struct Attendance {
    char studentId[20];      // 学生的学号（用于对应 Student 链表）
    int status;              // 出勤状态：1表示出勤，0表示缺勤
    struct Attendance *next; // 指向下一个考勤记录的指针（用于形成链表）
} Attendance;

// ==================== 课程考勤结构体 ====================
// 每节课有一个 ClassRecord 记录。
// 它包含该节课的课次编号（第几节课），
// 以及一个指向该节课考勤链表的指针。
typedef struct ClassRecord {
    int lessonNo;               // 第几节课，例如 1 表示第一节
    Attendance *attList;        // 指向本节课的考勤记录链表头
    struct ClassRecord *next;   // 指向下一节课的记录（形成链表）
} ClassRecord;

// ==================== 函数声明部分 ====================
// 在这里列出所有函数的名字和参数类型。
// 这样其他文件（例如 main.c）引用这个头文件后，
// 就知道这些函数的存在，可以直接调用。

// ---------- 学生管理函数 ----------

// 添加学生信息（手动输入学号、姓名、班级）
void addStudent();

// 显示所有学生信息（遍历链表打印）
void showStudents();

// 根据学号删除学生信息
void deleteStudent(char *id);

// ---------- 考勤管理函数 ----------

// 开始进行考勤（输入课次号，对所有学生进行点名）
void startAttendance(int lessonNo);

// 查看某一节课的考勤记录（按学号显示出勤/缺勤）
void showLessonAttendance(int lessonNo);

// 查看某个学生的全部考勤情况
void showStudentAttendance(char *id);

// ---------- 统计类函数 ----------

// 计算某节课的出勤率（出勤人数 / 总人数）
void countLessonRate(int lessonNo);

// 统计某个学生的缺勤次数（跨多节课统计）
void countStudentAbsence(char *id);

// ---------- 工具函数 ----------

// 设置控制台字体颜色（Windows平台）
// 参数color表示颜色编号，例如：
// 7 = 白色（默认）
// 10 = 绿色（成功提示）
// 11 = 浅蓝色（菜单标题）
// 12 = 红色（错误或警告）
void setColor(int color);

#endif    // 结束 #ifndef 判断，表示头文件定义结束
